package org.wikinews.controller;

import java.io.Serializable;
import java.util.List;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.Transactional;
import org.jboss.seam.annotations.web.RequestParameter;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.international.StatusMessage.Severity;
import org.wikinews.model.Leitura;
import org.wikinews.model.Post;
import org.wikinews.model.Usuario;
import org.wikinews.repo.LeituraRepo;
import org.wikinews.repo.PostRepo;
import org.wikinews.repo.UsuarioRepo;
import org.wikinews.service.FinanceiroService;
import org.wikinews.service.PostService;

@Name("leituraCtrl")
@Scope(ScopeType.CONVERSATION)
public class LeituraCtrl implements Serializable {

	private static final long serialVersionUID = 6612582663398485318L;

	@In
	private FacesMessages facesMessages;

	@In
	private PostRepo postRepo;

	@In
	private LeituraRepo leituraRepo;
	
	@In
	private UsuarioRepo usuarioRepo;
	
	@In
	private FinanceiroService financeiroService;
	
	@In
	private PostService postService;
	
	@In
	private Usuario usuario;

	@RequestParameter
	private Long postId;
	
	@RequestParameter
	private Long usuarioId;
	
	private Post post;
	
	private Leitura leitura;

	private Usuario autor;
	
	private String comentarioTexto;
	
	private String tagsPostTexto;
	
	private List<Post> postsPublicados;
	
	public Post getPost() {
		return post;
	}

	public String getComentarioTexto() {
		return comentarioTexto;
	}

	public void setComentarioTexto(String comentarioTexto) {
		this.comentarioTexto = comentarioTexto;
	}

	public Leitura getLeitura() {
		return leitura;
	}
	
	public void setLeitura(Leitura leitura) {
		this.leitura = leitura;
	}
	
	public Usuario getAutor() {
		return autor;
	}

	public void setAutor(Usuario autor) {
		this.autor = autor;
	}
	
	public String getTagsPostTexto() {
		return tagsPostTexto;
	}

	public void setTagsPostTexto(String tagsPostTexto) {
		this.tagsPostTexto = tagsPostTexto;
	}
	
	public List<Post> getPostsPublicados() {
		return postsPublicados;
	}

	@Begin(join = true)
	@Transactional
	public void ler() {
		post = postRepo.getById(postId);
		autor = post.getUsuario();
		leitura = leituraRepo.adicionar(post, usuario);
		financeiroService.ler(leitura);
	}

	@Transactional
	public void comentar() {
		post.addComentario(comentarioTexto, usuario);
		financeiroService.comentar(post, usuario);
		comentarioTexto = null;
		postRepo.persist(post);
	}
	
	@Transactional
	public void adicionarPostsFavoritos() {
		leitura.setFavorito(true);
		leitura.getPost().addFavorito();
		financeiroService.favorito(leitura);
		leituraRepo.persist(leitura);
		
		facesMessages.add("#{messages.postAdicionadoFavoritos}");
	}

	@Transactional
	public void removerPostsFavoritos() {
		leitura.setFavorito(false);
		leitura.getPost().removeFavorito();
		leituraRepo.persist(leitura);
		
		facesMessages.add("#{messages.postRemovidoFavoritos}");
	}
	
	@Transactional
	public void adicionarAutoresFavoritos() {
		usuario = usuarioRepo.findById(Usuario.class, usuario.getId());
		usuario.addUsuarioFavorito(post.getUsuario());
		post.getUsuario().addQuantidadeFavoritos();
		financeiroService.favorito(post.getUsuario());
		usuarioRepo.persist(usuario);
	}

	@Transactional
	public void removerAutoresFavoritos() {
		usuario = usuarioRepo.findById(Usuario.class, usuario.getId());
		usuario.removeUsuarioFavorito(post.getUsuario());
		post.getUsuario().removeQuantidadeFavoritos();
		usuarioRepo.persist(usuario);
	}
	
	@Transactional
	public void adicionarTagPost() {
		if (tagsPostTexto != null && tagsPostTexto != null) { 
			postService.adicionarListaTagsPost(post, tagsPostTexto);
			postRepo.persist(post);
			tagsPostTexto = "";
			facesMessages.add("#{messages.tagAdicionadaPost}");		
		} else {
			facesMessages.add(Severity.ERROR, "#{messages.erroTagNaoInformada}");
		}
	}
	
	@Transactional
	public void avaliarPost() {
		if (leitura.getAvaliacao() != null && leitura.getAvaliacao() > 0) {
			leituraRepo.persist(leitura);
			postRepo.atualizaAvaliacoes(post);
			usuarioRepo.atualizaAvaliacoes(post.getUsuario());
			facesMessages.add("#{messages.postAvaliado}");
		} else {
			facesMessages.add(Severity.ERROR, "#{messages.erroNotaNaoSelecionada}");
		}
	}
	
	@Transactional
	public void lerPostsPorAutor() {
		autor = usuarioRepo.getById(usuarioId);
		postsPublicados = postRepo.getAllByAutor(usuarioId);
	}
}
